#pragma once
#include "Game/Process/RenderProcess.h"
#include "Render/Tradition/ComputePipeline.h"
#include "Render/Shader/RHIDescriptor.h"
#include "Render/Tradition/RHIFramebuffer.h"
#include "../LocalEntity.h"
#include "../LocalShader.h"
#include "../ResourceProcess.h"
#include "../LocalScene.h"


class TaaProcess : public RenderProcess
{
	DECLARE_PROCESS(TaaProcess)

	struct PushConstants
	{
		glm::vec4 texelSize;
		glm::vec4 currentPrevJitter;
		glm::vec4 timeParams;
		float feedbackMin;
		float feedbackMax;
		int32 sharpen;
	};

public:

	bool mSharpen;

	PushConstants mPushConstants;

protected:

	virtual void OnInit() override;

	virtual void OnTick(float deltaTime) override;

	virtual void OnResize() override;

protected:

	LocalScene* mLocalScene;

	ResourceProcess* mResourceProcess;

	uint32 mOutputWidth;

	uint32 mOutputHeight;

	

	std::array<RefCountPtr<RHITexture>, 2> mColorImage;




	RefCountPtr<RHIDescriptor> mDescriptor;

	std::array<DescriptorMask, 2>  mColorDescriptorMask;

	std::array<DescriptorMask, 2>  mGBufferDescriptorMask;

	DescriptorMask mFinalDescriptorMask;




	RefCountPtr<ComputePipeline> mPipeline;

	RefCountPtr<RHICommandBuffer> mCommandBuffer;

	RefCountPtr<RHISemaphore> mWaitGraphicsSemaphore;

	RefCountPtr<RHISemaphore> mSignalComputeSemaphore;

};
